package com.tanhua.app.interceptor;

import com.tanhua.UserHolder;
import com.tanhua.app.service.UserService;
import com.tanhua.db.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 测试作用范围：
 *
 * @Scope:相当于bean标签的scope属性 作用：用于调整bean的作用范围
 * 使用位置: 被创建的类上
 * 属性：
 * value：指定作用范围的取值。取值是固定的5个，和XML的配置取值是一样的。
 * singleton: 单实例 默认值
 * prototype: 多实例
 * 生命周期:
 * @PostConstruct : 用在方法上
 * 使用位置: 初始化的方法上
 * ​   作用：指定初始化方法，相当于init-method
 * @PreDestroy : 使用在方法上
 * 作用：指定销毁方法，相当于destroy-method
 */
//@Scope("prototype")
@Component    //用于创建对象,将创建的对象存放到IOC容器中
//     value: 设置存放到IOC容器中id的值,如果不写默认为当前类的类名称,首字母小写
//以下三个注解跟@Component注解的作用一样,只不过下面三个注解提供了更加详细的语义化(见名知意)
//@Controller  // : 将web层的类创建对象存放到IOC容器中
//@Service     // : 将serice层的类创建对象存放到IOC容器中
//@Repository  // : 将dao层的类创建对象存放到IOC容器中
//@RestController//等价于 @Controller + @ResponseBody

//统一处理 token
public class TokenInterceptor implements HandlerInterceptor {
    @Autowired
    private UserService userService;

    @Override   //  控制器方法之前执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取app传递过来的 token       //获取知道请求头名称（key关键字）对应的值
        String token = request.getHeader("Authorization");

        //如果等于空
        if (token == null) {
            //设置响应状态码
            response.setStatus(401);
            ///获取字符输出流 用于向浏览器输出字符数据 并打印
            response.getWriter().print("权限不足..");

        }

        //根据token获取用户   安令牌查找
        User user = userService.findByToken(token);
        //如果等于空
        if (user == null) {
            //设置响应状态码
            response.setStatus(401);
            ///获取字符输出流 用于向浏览器输出字符数据 并打印
            response.getWriter().print("权限不足..");

        }
        // 将用户放入 ThreadLocal 中 在 controller 方法中取出（同一个）
        UserHolder.saveUser(user);
        // 放行
        return true;

    }
    @Override //整个程序结束
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //快速释放资源
        UserHolder.removeUser();
    }
}
